package ejb.com.bbva.cbm.util;

import java.util.ArrayList;
import java.util.List;

public class DivisorCadena {

	public static int limiteSaltos     = 42;
	public static int limiteCaracteres = 42; 
	
	public static List<String> obtenerCadenas(String cadena) {
		List<String> cadenas = new ArrayList<String>();
		
		//1.- VARIABLES DE TRABAJO
		int posicionIni = 0;
		int posicionFin = 0;
		int cantidadSaltos = 0;
		int cantidadSaltosLinea = 0;
				
		List<int[]> posicionesLinea = new ArrayList<int[]>();

		//2.- DETERMINAMOS LA CANTIDAD DE SALTOS
		for (int i = 0; i < cadena.length(); i++) {
			if(cadena.charAt(i)=='\n') {
				posicionFin = i+1;
				posicionesLinea.add(new int[] {posicionIni, posicionFin});
				
				String linea = cadena.substring(posicionIni, posicionFin);
				
				cantidadSaltosLinea = (int) Math.ceil((linea.length()*1.0)/(limiteCaracteres*1.0));
				cantidadSaltosLinea = (cantidadSaltosLinea == 0)?1:cantidadSaltosLinea;
				
				cantidadSaltos = cantidadSaltos + cantidadSaltosLinea;
				
				System.out.println("linea " + posicionesLinea.size() + ", lineas internas " + cantidadSaltosLinea);
				//System.out.println(Math.ceil((linea.length()*1.0)/(limiteCaracteres*1.0)) + " - " + (linea.length()*1.0)/(limiteCaracteres*1.0));
				
				posicionIni = posicionFin;
            }
		}
		
		//3.- DIVIDIMOS LA CADENA
		if(cantidadSaltos > limiteSaltos) {
			int cantidadCadenas = (int) Math.ceil((cantidadSaltos*1.0)/(limiteSaltos*1.0));
			
			if (cantidadCadenas > posicionesLinea.size()) {
				cantidadCadenas = posicionesLinea.size();
			}
			
			int rango = (int) Math.ceil((posicionesLinea.size()*1.0)/(cantidadCadenas*1.0));
			int indice = 0;

			System.out.println("Longitud ["+cadena.length()+"] Saltos [" + cantidadSaltos + "] Cadenas ["+cantidadCadenas+"] Rango ["+rango+"] Lineas ["+posicionesLinea.size()+"]");
			for (int i = 1; i <= cantidadCadenas; i++) {
				posicionIni = posicionesLinea.get(indice)[0];
				posicionFin = posicionesLinea.get((i==cantidadCadenas)?posicionesLinea.size()-1:indice+rango-1)[1];
				
				System.out.println("["+posicionIni+","+posicionFin+"]");
				
				String linea = cadena.substring(posicionIni, posicionFin);
				//System.out.println("Bloque " + i + " de "+ cantidadCadenas + " ["+posicionIni+","+posicionFin+"]");
				//System.out.println(linea);
				
				cadenas.add(linea);
				
				indice = indice + rango;
			}
		} else {
			System.out.println("Longitud ["+cadena.length()+"] Saltos [" + cantidadSaltos + "] Cadenas [1] Rango [1] Lineas ["+posicionesLinea.size()+"]");
			cadenas.add(cadena);
		}
		
		return cadenas;
	}
	
	public static void main(String[] args) {
		String cadena = "";
		cadena += "12345671234567\n";
		cadena += "aaaaabbbbbbbbbb\n";
		cadena += "cccccdddddddddd\n";
		cadena += "eeeeeffffffffff\n";
		
		List<String> cadenas = DivisorCadena.obtenerCadenas(cadena);
		
		for (String string : cadenas) {
			System.out.print(string);
		}
	}
}
